#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/9/12 19:37
# @Author  : 王凯
# @File    : hycw_clean.py
# @Project : scrapy_spider
import datetime
import json
from pathlib import Path

from apps.data_stats.data_stats.clean import BaseClean, CODE_MAPPING
from apps.patent.clean import IndustryModel

FIELD_CODES = [
    ['企业单位数_本月末', '工业企业单位数', 'unit_qty'],
    ['亏损企业单位数_本月末', '工业亏损企业单位数', 'loss_company_unit_qty'],
    ['亏损企业单位数_增减', '工业亏损企业单位数', 'loss_company_unit_qty_yoy_lod'],
    ['流动资产合计_本月末', '工业企业流动资产合计', 'current_assets_sum'],
    ['流动资产合计_增减', '工业企业流动资产合计', 'current_assets_sum_yoy_lod'],
    ['应收账款_本月末', '工业企业应收账款', 'receivables'],
    ['应收账款_增减', '工业企业应收账款', 'receivables_yoy_lod'],
    ['存货_本月末', '工业企业存货', 'inventory'],
    ['存货_增减', '工业企业存货', 'inventory_yoy_lod'],
    ['产成品存货_本月末', '工业企业产成品存货', 'finished_goods_inventory'],
    ['产成品存货_增减', '工业企业产成品存货', 'finished_goods_inventory_yoy_lod'],
    ['资产总计_本月末', '工业企业资产总计', 'assets_sum'],
    ['资产总计_增减', '工业企业资产总计', 'assets_sum_yoy_lod'],
    ['负债合计_本月末', '工业企业负债合计', 'liabilities_sum'],
    ['负债合计_增减', '工业企业负债合计', 'liabilities_sum_yoy_lod'],
    ['营业收入_累计值', '工业企业营业收入', 'operating_revenue_sum'],
    ['营业收入_累计增长', '工业企业营业收入', 'operating_revenue_sum_yoy_increase'],
    ['主营业务收入_累计值', '工业企业主营业务收入', 'main_business_income_sum'],
    ['主营业务收入_累计增长', '工业企业主营业务收入', 'main_business_income_sum_yoy_increase'],
    ['营业成本_累计值', '工业企业营业成本', 'operating_costs_sum'],
    ['营业成本_累计增长', '工业企业营业成本', 'operating_costs_sum_yoy_increase'],
    ['主营业务成本_累计值', '工业企业主营业务成本', 'main_business_cost_sum'],
    ['主营业务成本_累计增长', '工业企业主营业务成本', 'main_business_cost_sum_yoy_increase'],

    ['销售费用_累计值', '工业企业销售费用', 'sale_cost_sum'],
    ['销售费用_累计增长', '工业企业销售费用', 'sale_cost_sum_yoy_increase'],

    ['营业费用_累计值', '工业企业营业费用', 'sale_cost_sum'],
    ['营业费用_累计增长', '工业企业营业费用', 'sale_cost_sum_yoy_increase'],

    ['管理费用_累计值', '工业企业管理费用', 'manage_cost_sum'],
    ['管理费用_累计增长', '工业企业管理费用', 'manage_cost_sum_yoy_increase'],
    ['财务费用_累计值', '工业企业财务费用', 'finance_cost_sum'],
    ['财务费用_累计增长', '工业企业财务费用', 'finance_cost_sum_yoy_increase'],
    ['利息支出_累计值', '工业企业利息支出', 'interest_expenditure_sum'],
    ['利息支出_累计增长', '工业企业利息支出', 'interest_expenditure_sum_yoy_increase'],
    ['投资收益_累计值', '工业企业投资收益', 'invest_income_sum'],
    ['投资收益_累计增长', '工业企业投资收益', 'invest_income_sum_yoy_increase'],
    ['营业利润_累计值', '工业企业营业利润', 'operating_profit_sum'],
    ['营业利润_累计增长', '工业企业营业利润', 'operating_profit_sum_yoy_increase'],
    ['利润总额_累计值', '工业企业利润总额', 'profit_total_sum'],
    ['利润总额_累计增长', '工业企业利润总额', 'profit_total_sum_yoy_increase'],
    ['亏损企业亏损总额_累计值', '工业企业亏损企业亏损总额', 'loss_company_loss_total_sum'],
    ['亏损企业亏损总额_累计增长', '工业企业亏损企业亏损总额', 'loss_company_loss_total_sum_yoy_increase'],
    ['亏损企业亏损总额_累计值', '工业亏损企业亏损总额', 'loss_company_loss_total_sum'],
    ['亏损企业亏损总额_累计增长', '工业亏损企业亏损总额', 'loss_company_loss_total_sum_yoy_increase'],
    ['应收票据及应收账款_本月末', '工业企业应收票据及应收账款', 'accounts_receivable_and_notes_receivable'],
    ['应收票据及应收账款_增减', '工业企业应收票据及应收账款', 'accounts_receivable_and_notes_receivable_yoy_lod'],
    ['利息费用_累计值', '工业企业利息费用', 'interest_cost_sum'],
    ['利息费用_累计增长', '工业企业利息费用', 'interest_cost_sum_yoy_increase'],
    ['所有者权益合计_本月末', '工业企业所有者权益合计', 'owner_equity_sum'],
    ['所有者权益合计_增减', '工业企业所有者权益合计', 'owner_equity_sum_yoy_lod'],
    ['平均用工人数_累计值', '工业企业平均用工人数', 'mean_workforce_size_sum'],
    ['平均用工人数_累计增长', '工业企业平均用工人数', 'mean_workforce_size_sum_yoy_increase'],
    ['主营业务税金及附加_累计值', '工业企业主营业务税金及附加', 'main_business_taxes_and_additional_sum'],
    ['主营业务税金及附加_累计增长', '工业企业主营业务税金及附加', 'main_business_taxes_and_additional_sum_yoy_increase'],
    ['应交增值税_累计值', '工业企业应交增值税', 'payable_vat_sum'],
    ['应交增值税_累计增长', '工业企业应交增值税', 'payable_vat_sum_yoy_increase'],
    ['流动资产平均余额_累计值', '工业企业流动资产平均余额', 'current_assets_mean_balance_sum'],
    ['流动资产平均余额_累计增长', '工业企业流动资产平均余额', 'current_assets_mean_balance_sum_yoy_increase'],
    ['利息净支出_累计值', '工业企业利息净支出', 'interest_net_expenditure_sum'],
    ['利息净支出_累计增长', '工业企业利息净支出', 'interest_net_expenditure_sum_yoy_increase'],
]


class HycwClean(BaseClean):
    def __init__(self):
        super().__init__()
        with open(f"{Path(__file__).parent.parent.parent.parent.parent}/apps/patent/clean/dm_gjhyhf_map_qyzhpjhyysb.json", "r", encoding="utf-8") as f:
            self.industry_model = IndustryModel(industry_info=json.loads(f.read()))

    def save_data(self, datas):
        batch_size = 1000
        for i in range(0, len(datas), batch_size):
            self.to_db.add_batch_smart("net_industry_finance_index_info", list(datas[i:i + batch_size]), update_columns=list(datas[0].keys()))

    def deal_df(self, df):

        def process_data(df_pro):
            item = {}
            for j in df_pro.to_dict("records"):
                for filed in FIELD_CODES:
                    if j["header"] == filed[0] and j['cate_3'] == filed[1]:
                        if j['unit'] == '%':
                            item[filed[2]] = j["num"] / 100
                        else:
                            item[filed[2]] = j["num"]
                item["industry_name"] = j["industry_name"]
                item["industry_code"] = j["industry_code"]
                item["time"] = j["date_string"]
            return item

        df['industry_name'] = df['tag_name'].str.extract(r"(.*?(?:开采辅助活动|开采专业及辅助性活动|业))")
        df["header"] = df['tag_name'].str.extract(r".*?(?:开采辅助活动|开采专业及辅助性活动|业)(.*)")
        df['industry_code'] = df['industry_name'].map(lambda x: CODE_MAPPING.get(x) or self.industry_model.search_maps.get(x))
        datas = list(df.groupby(["industry_name", "date_string"]).apply(process_data).to_dict().values())
        self.save_data(datas)
        return datas

    def run_2001(self):
        df = self.get_data_from_db(cate_1="工业", cate_2="按行业分工业企业主要经济指标(2001-2002)", condition=" and area = '全国' ")
        df = df[df['date_string'].str.startswith(tuple(str(i) for i in range(2001, 2003)))]
        return self.deal_df(df)

    def run_2003(self):
        df = self.get_data_from_db(cate_1="工业", cate_2="按行业分工业企业主要经济指标(2003-2011)", condition=" and area = '全国' ")
        df = df[df['date_string'].str.startswith(tuple(str(i) for i in range(2003, 2012)))]
        return self.deal_df(df)

    def run_2012(self):
        df = self.get_data_from_db(cate_1="工业", cate_2="按行业分工业企业主要经济指标(2012-2017)", condition=" and area = '全国' ")
        df = df[df['date_string'].str.startswith(tuple(str(i) for i in range(2012, 2018)))]
        return self.deal_df(df)

    def run_2018(self):
        df = self.get_data_from_db(cate_1="工业", cate_2="按行业分工业企业主要经济指标(2018-至今)", condition=" and area = '全国' ")
        df = df[df['date_string'].str.startswith(tuple(str(i) for i in range(2018, datetime.datetime.now().year + 1)))]
        return self.deal_df(df)

    def run(self):
        self.run_2001()
        self.run_2003()
        self.run_2012()
        self.run_2018()


if __name__ == '__main__':
    HycwClean().run()
